package com.sap.sap_mangers.mapper;

import com.sap.sap_mangers.Vo.BmsVo.BmsBorrowVo;
import com.sap.sap_mangers.Vo.BmsVo.BmsCategoryWithBookNumberVo;
import com.sap.sap_mangers.Vo.BmsVo.BmsManagerVo;
import com.sap.sap_mangers.Vo.BmsVo.BmsUserForTimeNoReturningVo;
import com.sap.sap_mangers.entity.Bms.BorrowNumberInEachMonth;
import com.sap.sap_mangers.pojo.SapBmsBook;
import com.sap.sap_mangers.pojo.SapBmsBorrow;
import com.sap.sap_mangers.pojo.SapBmsManagerSimpleInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 图书管理系统 bms(Book Management System) mapper
 *
 * @author ZhouKai
 * 2022/8/8 20:09
 */
@Mapper
public interface BmsMapper {

    /**
     * 添加图书类别(名称) (可以按语言、方向等分类)
     * 注意要防止类别重复
     *
     * @param categoryName 类别名称
     */
    void addBmsCategory(@Param("categoryName") String categoryName);

    /**
     * 修改图书类别(名称)
     * 没有设置删除:防止分类表中的编号找不到对应内容(没设置外键,随意删除不报错)
     *
     * @param oldCategoryName 原类别名称
     * @param newCategoryName 新的类别名称
     */
    void updateBmsCategory(@Param("oldCategoryName") String oldCategoryName, @Param("newCategoryName") String newCategoryName);

    /**
     * 根据类别名称获取对应id
     *
     * @param categoryName 类别名称
     * @return 对应编号(可根据是否为null判断该类别名称是否已存在)
     */
    Integer getBmsCategoryId(@Param("categoryName") String categoryName);

    /**
     * 根据类别编号获取对应名称
     *
     * @param categoryId 类别编号
     * @return 对应名称(可根据是否为null判断该编号是否存在)
     */
    String getBmsCategoryName(@Param("categoryId") Integer categoryId);

    /**
     * 获取所有类别
     *
     * @return 所有类别的名称
     */
    List<String> getAllCategory();

    /**
     * 将新书信息加入到书籍表
     *
     * @param sapBmsBook 新书信息
     */
    void newBookInsertToBookTable(@Param("sapBmsBook") SapBmsBook sapBmsBook);

    /**
     * 添加书籍到书籍与类型对应的表
     *
     * @param bookId        书籍的id
     * @param bmsCategoryId 书籍的类型id
     */
    void addBookInsertToBmsClassification(@Param("bookId") Integer bookId, @Param("bmsCategoryId") Integer bmsCategoryId);

    /**
     * 查询当前最大的书号id
     *
     * @return 书的id
     */
    Integer selectMaxId();

    /**
     * 清空当前图书系统管理表
     */
    void clearBmsManagerTable();

    /**
     * 插入管理表 (作为备用管理员，默认情况下不是管理员)
     *
     * @param username (部长及以上成员)学号
     */
    void addBmsManager(@Param("username") String username);

    /**
     * 设置或撤销管理员身份
     *
     * @param username    管理表中的学号
     * @param responsible true:设置; false:撤销
     */
    void updateBmsManager(@Param("username") String username, @Param("responsible") Boolean responsible);

    /**
     * 查询所有书籍的信息
     *
     * @return 所有书籍的信息
     */
    List<SapBmsBook> getAllBookInformation();

    /**
     * 根据类别获取书籍信息
     *
     * @param classification 类别名称
     * @return 书籍信息列表
     */
    List<SapBmsBook> getBookInformationByClass(@Param("classification") String classification);

    /**
     * 通过书号获得该书的全部类型标签
     *
     * @param bookId 书号
     * @return 该书的类型标签
     */
    List<String> getCateGoryByBookId(@Param("bookId") Integer bookId);

    /**
     * 通过书籍id查询到创建时间
     *
     * @param bookId 书籍id
     * @return 书籍的添加时间
     */
    Date getCreateTimeByBookId(@Param("bookId") Integer bookId);


    /**
     * 获取所有(备用/正式)管理员信息
     *
     * @return 管理员信息列表 (结果按职务对应的id和学号排序)
     */
    List<BmsManagerVo> getBmsManagerVos();

    /**
     * 获取该管理员当前是否负责管理系统
     *
     * @param username 管理员学号
     * @return 是否负责管理
     */
    Boolean getResponsible(@Param("username") String username);

    /**
     * 查询当前所有(正式)管理员
     *
     * @return 当前具有管理职责的管理员(正式管理员)信息的集合
     */
    List<BmsManagerVo> getBmsResponsibleManagerVos();

    /**
     * 查询当前正式管理员数量
     *
     * @return 当前正式管理员数量
     */
    Integer getResponsibleManagerNumber();

    /**
     * 修改书籍的信息 :可以修改 价格，简介，书籍的状态
     *
     * @param sapBmsBook 书籍信息
     */
    void updateBookInformationInBookTable(@Param("sapBmsBook") SapBmsBook sapBmsBook);


    /**
     * 将 该书的所有类型删除 从sap_bms_classification表中
     *
     * @param bookId 书号
     */
    void deleteBookClassification(@Param("bookId") Integer bookId);

    /**
     * 查询book表书号为该bookId的书籍
     *
     * @param bookId 书号
     * @return 书籍数量
     */
    SapBmsBook getBookInformationByBookId(@Param("bookId") Integer bookId);
//    void modifyBookState(@Param("bookId")Integer bookId,@Param("state")String state);

    /**
     * 获取书籍的状态
     *
     * @param bookId 书籍编号
     * @return 当前状态
     */
    String getBookStatesByBookId(@Param("bookId") Integer bookId);

    /**
     * 添加借阅记录
     *
     * @param sapBmsBorrow 借阅信息
     */
    void addBmsBorrowRecord(@Param("sapBmsBorrow") SapBmsBorrow sapBmsBorrow);

    /**
     * 获取指定书籍的信息
     *
     * @param bookId 书籍编号
     * @return 书籍信息
     */
    SapBmsBook getBookInfo(@Param("bookId") Integer bookId);

    /**
     * 获得自己所有的借阅信息
     *
     * @param username 用户id
     * @return 自己的借阅信息
     */
    List<BmsBorrowVo> getUserBorrowInformation(@Param("username") String username);

    /**
     * 查询所有的借阅记录
     *
     * @return 所有的借阅记录
     */
    List<BmsBorrowVo> getAllBorrowInformation();

    /**
     * 判断是否存在相同的借阅请求
     * (查找书籍编号和申请人相同，且状态为申请中的记录，用于避免重复发送借阅请求)
     *
     * @param bookId   书籍编号
     * @param username 申请人学号
     * @return 借阅记录编号 (用于判断是否存在相同的借阅请求)
     */
    Integer isThereSameBorrowRecord(@Param("bookId") Integer bookId, @Param("username") String username);

    /**
     * 将所有超过了预定归还时间的书的状态 由 借阅中 改为 超时未归还
     */
    void updateAllBookTimeoutNoReturn();

    /**
     * 查询状态为 ‘申请中’的记录
     *
     * @return 借阅记录
     */
    List<BmsBorrowVo> getRecordOfBorrowingApplication();

    /**
     * 查询状态为 ‘申请归还’的记录
     *
     * @return 借阅记录
     */
    List<BmsBorrowVo> getRecordOfReturningApplication();

    /**
     * 查询到所有书籍未归还的用户信息
     *
     * @return 所有的用户信息
     */
    List<BmsUserForTimeNoReturningVo> getAllUserMessageForBookTimeoutNoReturn();

    /**
     * 得到所有图书管理员的简单信息
     *
     * @return 图书管理员的简单信息
     */
    List<SapBmsManagerSimpleInfo> getSapBmsManagerSimpleInfos();

    /**
     * 修改申请表 --> 修改申请状态，最近操作人学号，最近操作人真实姓名
     */
    void updateBorrowStateByOperator(@Param("bmsBorrowVo") BmsBorrowVo bmsBorrowVo);

    /**
     * 查询是否为图书管理员
     *
     * @param username 学号
     * @return 为1说明是管理员
     */
    Long isBookManager(@Param("username") String username);

    /**
     * 通过bmsBorrowId在借阅表中查看到对应的该条记录
     *
     * @param bmsBorrowId 借阅编号
     * @return 借阅信息
     */
    BmsBorrowVo getBorrowInfoByBmsBorrowId(@Param("bmsBorrowId") Integer bmsBorrowId);

    /**
     * 修改借阅状态
     *
     * @param borrowId 要修改状态的借阅记录的编号
     * @param state    新借阅状态
     */
    void updateBorrowState(@Param("borrowId") Integer borrowId, @Param("state") String state);

    /**
     * 获取借阅记录
     *
     * @param borrowId 借阅记录的编号
     * @return 对应的借阅记录
     */
    SapBmsBorrow getBorrowById(@Param("borrowId") Integer borrowId);

    /**
     * 获取书籍类别及对应其书籍数量 (一本书可以有多个类别)
     *
     * @return 书籍类别及其对应书籍数量视图对象集合
     */
    List<BmsCategoryWithBookNumberVo> getCategoryWithBookNumber();

    /**
     * 用于判断是否是管理员
     *
     * @param username 学号
     * @return 如果为null说明没找到数据，不是管理员
     */
    String getManagerUsernameByUsername(@Param("username") String username);

    /**
     * 获取过去一年中每个月的借阅申请次数
     *
     * @return 过去一年中每个月的借阅申请次数 (从近向远排列)
     */
    List<BorrowNumberInEachMonth> getBorrowNumberEachMonthInThePastYear();

    /**
     * 修改书籍状态 (book表)
     *
     * @param bookId 书号
     * @param state 状态
     */
    void updateBookStates(@Param("bookId") Integer bookId, @Param("state") String state);

    /**
     * 根据bookId 获取bookName
     *
     * @param bookId 书籍编号
     * @return 书名
     */
    String getBookNameById(@Param("bookId") Integer bookId);
}
